package cn.hinglo.baseservice.base;

import cn.hinglo.common.entity.Result;
import cn.hinglo.common.enums.ExceptionEnum;
import cn.hinglo.common.utils.ResultUtils;
import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * @author HingLo
 * @createTime: 2018/9/18 13:50
 * @description: 请求类的基类
 */
@SuppressWarnings("rawtypes")
public class BaseController {

    /**
     * 子类线程安全的request
     */
    @Autowired
    protected HttpServletRequest request;

    @Autowired
    protected HttpServletResponse response;

    /**
     * 表示请求成功,不返回任何数据
     *
     * @return 返回result对象
     */
    protected Result success() {
        return ResultUtils.success();
    }

    /**
     * 返回制定内容的数据对象
     *
     * @param object 制定的内容
     * @return 返回result对象
     */
    protected Result success(Object object) {
        return ResultUtils.success(object);
    }

    /**
     * 请求失败，传入失败code,与信息
     *
     * @param code 响应吗
     * @param msg  消息提示
     * @return 响应结果
     */
    protected Result error(Integer code, String msg) {
        return ResultUtils.error(code, msg);
    }

    /**
     * 错误信息，返回默认的-1 代码，提示信息自定义
     *
     * @param msg 消息提示
     * @return 响应结果
     */
    protected Result<Object> error(String msg) {
        return ResultUtils.error(msg);
    }

    /**
     * 重载error方法，传入一个枚举类型，
     *
     * @param exceptionEnum 枚举类型的错误对象
     * @return 响应结果
     */
    protected Result error(ExceptionEnum exceptionEnum) {
        return ResultUtils.error(exceptionEnum.getCode(), exceptionEnum.getMessage());
    }

    /**
     * 需要判断的返回的结果，使用此方法，且操作成功后，无数据返回
     *
     * @param bool 操作是否成功
     */
    protected Result result(boolean bool) {
        if (bool) {
            return success();
        } else {
            return error("操作失败");
        }
    }

    /**
     * 携带错误消息提示的结果
     *
     * @param bool 操作结果（True/False)
     * @param msg  错误就返回消息
     */
    protected Result result(boolean bool, String msg) {
        if (bool) {
            return success();
        } else {
            return error(msg);
        }
    }

    /**
     * 携带成功数据的消息结果
     *
     * @param bool 操作结果
     * @param msg  携带成功需要数据
     */
    protected Result result(boolean bool, Object msg) {
        if (bool) {
            return success(msg);
        } else {
            return error("操作失败");
        }
    }

    /**
     * 携带成功数据的消息与失败提示消息
     *
     * @param bool     操作结果
     * @param msg      携带成功需要数据
     * @param errorMsg 错误时候,需要提示的消息内容
     */
    protected Result result(boolean bool, Object msg, String errorMsg) {
        if (bool) {
            return success(msg);
        } else {
            return error(errorMsg);
        }
    }

    /**
     * 分页处理中获取指定的页码
     *
     * @return 返回页码
     */
    protected Integer getPage(Integer page) {
        if (page == null || page < 1) {
            page = 1;
        }
        return page;
    }

    /***
     * 分页处理中获取指定页面的数据大小
     *
     * @param size 页面大小处理
     * @return 返回页面数据大小
     */
    protected Integer getSize(Integer size) {
        // 默认页码为10条数据
        int defaultSize = 10;
        if (size == null || size < defaultSize) {
            size = 10;
        }
        return size;
    }

    /**
     * 设置属性到session中
     *
     * @param key   key
     * @param value value
     */
    protected void setSessionAttr(String key, Object value) {
        request.getSession().setAttribute(key, value);
    }

    /**
     * 从session中获取指定的值
     *
     * @param key key
     * @param <T> 返回值
     * @return 返回结果
     */
    @SuppressWarnings("unchecked")
    protected <T> T getSessionAttr(String key) {
        return (T) request.getAttribute(key);
    }
}
